// 认证相关工具函数
import storage from './storage.js'
import platform from './platform.js'

const TOKEN_KEY = 'token'
const USER_INFO_KEY = 'userInfo'
const LOGIN_TIME_KEY = 'loginTime'

// 获取token
export function getToken() {
  return storage.userStorage.getToken()
}

// 设置token
export function setToken(token) {
  storage.userStorage.setToken(token)
  storage.userStorage.setLoginTime()
  return true
}

// 移除token
export function removeToken() {
  return storage.removeStorageSync(TOKEN_KEY)
}

// 获取用户信息
export function getUserInfo() {
  return storage.userStorage.getUserInfo()
}

// 设置用户信息
export function setUserInfo(userInfo) {
  return storage.userStorage.setUserInfo(userInfo)
}

// 移除用户信息
export function removeUserInfo() {
  return storage.removeStorageSync(USER_INFO_KEY)
}

// 检查是否已登录
export function isLoggedIn() {
  
  const token = getToken()
  const userInfo = getUserInfo()

  // 检查token和用户信息是否存在
  if (!token || !userInfo) {
    return false
  }

  // 检查登录是否过期
  if (storage.userStorage.isLoginExpired()) {
    clearAuth()
    return false
  }

  return true
}

// 需要登录的操作包装器
export function requireLogin(callback, options = {}) {
  if (isLoggedIn()) {
    if (typeof callback === 'function') {
      callback()
    }
    return true
  } else {
    showLoginModal(options)
    return false
  }
}

// 显示登录提示框
export function showLoginModal(options = {}) {
  const {
    title = '提示',
    content = '此操作需要登录，是否前往登录？',
    showCancel = true,
    confirmText = '去登录',
    cancelText = '取消'
  } = options

  // #ifdef MP-WEIXIN
  // 微信小程序
  uni.showModal({
    title,
    content,
    showCancel,
    confirmText,
    cancelText,
    success: (res) => {
      if (res.confirm) {
        uni.navigateTo({
          url: '/pages/login'
        })
      }
    }
  })
  // #endif

  // #ifdef H5
  // H5环境
  if (platform.isWeChat()) {
    // 微信浏览器中的特殊处理
    uni.showModal({
      title,
      content: content + '\n（微信环境下建议使用小程序版本）',
      showCancel,
      confirmText,
      cancelText,
      success: (res) => {
        if (res.confirm) {
          uni.navigateTo({
            url: '/pages/login'
          })
        }
      }
    })
  } else {
    // 普通浏览器
    uni.showModal({
      title,
      content,
      showCancel,
      confirmText,
      cancelText,
      success: (res) => {
        if (res.confirm) {
          uni.navigateTo({
            url: '/pages/login'
          })
        }
      }
    })
  }
  // #endif

  // #ifdef APP-PLUS
  // APP环境
  uni.showModal({
    title,
    content,
    showCancel,
    confirmText,
    cancelText,
    success: (res) => {
      if (res.confirm) {
        uni.navigateTo({
          url: '/pages/login'
        })
      }
    }
  })
  // #endif
}

// 退出登录
export function logout() {
  clearAuth()

  // 平台特定的退出处理
  // #ifdef MP-WEIXIN
  uni.showToast({
    title: '已退出登录',
    icon: 'success'
  })

  // 小程序跳转到首页
  uni.switchTab({
    url: '/pages/index'
  })
  // #endif

  // #ifdef H5
  uni.showToast({
    title: '已退出登录',
    icon: 'success'
  })

  // H5环境刷新页面或跳转
  setTimeout(() => {
    if (platform.isWeChat()) {
      // 微信浏览器中跳转
      uni.switchTab({
        url: '/pages/index'
      })
    } else {
      // 普通浏览器可以刷新页面
      window.location.reload()
    }
  }, 1500)
  // #endif

  // #ifdef APP-PLUS
  uni.showToast({
    title: '已退出登录',
    icon: 'success'
  })

  // APP跳转到首页
  uni.switchTab({
    url: '/pages/index'
  })
  // #endif
}

// 清除认证信息
export function clearAuth() {
  storage.userStorage.clearUserData()
}

// 检查token是否过期
export function isTokenExpired() {
  return storage.userStorage.isLoginExpired()
}

// 刷新token（如果后端支持）
export function refreshToken() {
  return new Promise((resolve, reject) => {
    const token = getToken()
    if (!token) {
      reject(new Error('无token'))
      return
    }

    // 这里可以调用刷新token的API
    // 暂时返回原token
    resolve(token)
  })
}

// 自动登录检查
export function autoLoginCheck() {
  return new Promise((resolve, reject) => {
    const token = getToken()
    const userInfo = getUserInfo()

    if (!token || !userInfo) {
      reject(new Error('未登录'))
      return
    }

    if (isTokenExpired()) {
      // 尝试刷新token
      refreshToken()
        .then(newToken => {
          setToken(newToken)
          resolve({ token: newToken, userInfo })
        })
        .catch(() => {
          clearAuth()
          reject(new Error('登录已过期'))
        })
    } else {
      resolve({ token, userInfo })
    }
  })
}

// 获取用户权限
export function getUserPermissions() {
  const userInfo = getUserInfo()
  return userInfo?.permissions || []
}

// 检查用户权限
export function hasPermission(permission) {
  const permissions = getUserPermissions()
  return permissions.includes(permission)
}

// 检查用户角色
export function hasRole(role) {
  const userInfo = getUserInfo()
  const roles = userInfo?.roles || []
  return roles.includes(role)
}

// 获取用户头像
export function getUserAvatar() {
  const userInfo = getUserInfo()
  return userInfo?.avatar || '/static/images/default-avatar.svg'
}

// 获取用户昵称
export function getUserNickname() {
  const userInfo = getUserInfo()
  return userInfo?.nickname || userInfo?.username || '未设置昵称'
}

// 更新用户信息
export function updateUserInfo(newUserInfo) {
  const currentUserInfo = getUserInfo() || {}
  const updatedUserInfo = {
    ...currentUserInfo,
    ...newUserInfo
  }

  setUserInfo(updatedUserInfo)
  return updatedUserInfo
}

// 登录成功后的处理
export function handleLoginSuccess(loginResult) {
  const { token, userInfo } = loginResult

  // 保存认证信息
  setToken(token)
  setUserInfo(userInfo)

  // 平台特定处理
  // #ifdef MP-WEIXIN
  // 小程序可以设置用户信息到全局
  getApp().globalData.userInfo = userInfo
  // #endif

  // #ifdef H5
  // H5环境可以设置到window对象
  if (typeof window !== 'undefined') {
    window.userInfo = userInfo
  }
  // #endif

  // #ifdef APP-PLUS
  // APP环境可以设置到plus对象
  if (typeof plus !== 'undefined') {
    plus.storage.setItem('currentUser', JSON.stringify(userInfo))
  }
  // #endif

  return true
}

// 游客模式检查
export function isGuestMode() {
  return !isLoggedIn()
}

// 游客模式提示
export function showGuestTip(action = '此操作') {
  uni.showToast({
    title: `${action}需要登录`,
    icon: 'none',
    duration: 2000
  })
}

export default {
  getToken,
  setToken,
  removeToken,
  getUserInfo,
  setUserInfo,
  removeUserInfo,
  isLoggedIn,
  requireLogin,
  showLoginModal,
  logout,
  clearAuth,
  isTokenExpired,
  refreshToken,
  autoLoginCheck,
  getUserPermissions,
  hasPermission,
  hasRole,
  getUserAvatar,
  getUserNickname,
  updateUserInfo,
  handleLoginSuccess,
  isGuestMode,
  showGuestTip
}
